package com.seezoon.admin.framework.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.PageSerializable;
import com.seezoon.dao.framework.entity.AbstractQueryCondition;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;

/**
 * @author 黎小荣
 * @since 2023/3/22
 */
public interface IBaseService<T> extends IService<T> {

    /**
     * 根据主键查询
     */
    T find(@NotNull Serializable id);

    /**
     * 根据条件返回一个
     */
    @Transactional(readOnly = true)
    T findOne(AbstractQueryCondition condition);

    /**
     * 自定义条件查询
     */
    @Transactional(readOnly = true)
    public List<T> find(AbstractQueryCondition condition);

    /**
     * 分页查询
     *
     * @param condition
     * @param pageNum
     * @param pageSize
     * @param count
     * @return
     */
    @Transactional(readOnly = true)
    public PageInfo<T> find(AbstractQueryCondition condition, int pageNum, int pageSize, boolean count);

    /**
     * 分页查询
     * <p>
     * {@code PageSerializable}属性较少，适合序列化，如果想要更多属性，可以使用{@link PageInfo}
     *
     * @param condition
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Transactional(readOnly = true)
    public PageSerializable<T> find(AbstractQueryCondition condition, int pageNum, int pageSize);

    int saveOne(T record);

    /**
     * 插入支持批量
     *
     * @param records
     * @return
     */
    public int save(@NotEmpty T... records);

    /**
     * 按主键选择性更新，默认自动修改更新时间及更新人
     *
     * @param record
     * @return
     */
    public int updateSelective(@NotNull T record);

    /**
     * 按主键全量更新,默认自动修改更新时间及更新人
     *
     * <pre>
     * 默认不更新创建时间及创建时间
     * </pre>
     *
     * @param record
     * @return
     */
    public int update(@NotNull T record);

    /**
     * 按主键删除，一般业务在逻辑上保证不会删除，如果非要删除建议使用逻辑删除
     *
     * <pre>
     * 该方法不做权限控制
     * </pre>
     *
     * @param pks
     * @return
     */
    public int delete(@NotEmpty Serializable... ids);
}
